﻿Imports System.Xml
Imports System.IO


'
'Voorbeeld blok
'
'Vak        = Uf ,,com2v,,dsn2v,,ict2v
'Klas       = Uk ,,m21p3,,m22p3,,m23p3,,m24p3
'Leraar     = Ul ,,kui,,man,,vuh
'Lokaal     = Ur ,,R1_3.18
'??         = Uz1 1 4 1 1
'??         = Uz2 1 4 2 1           n
'??         = Uz3 1 4 3 1            ,"flash"
'Les?       = UZ00 ,5/1,,R1_3.18
'Les?       = UZ00 ,5/2,,R1_3.18
'Duur(week) = 0U ,6558,wk2-8,wk2-8,"t/b",,,,,,,,,Bn,,,,0,398341502
'


Public Class PersonalXML

    'Dim toOutlookClass As New toOutlook

    Dim huidigeRegel() As String
    Dim BezigInBlok As Boolean = False
    Dim KlasGehad As Boolean = False
    Dim tempVak As String
    Dim datum As String
    Dim startdatum As Date


    Private Function checkCharacterReference(ByVal word As String) As String
        ' Functie checkCharacterReference controleert of er geen tekens zijn die XML niet kan parsen
        ' voorbeelden zijn de tekens <, >, &, ' en "

        If word.IndexOf("&") <> -1 Then
            Dim pos As Integer
            pos = word.IndexOf("&")
            word = word.Remove(pos, 1)
            word = word.Insert(pos, "&amp;")

        ElseIf word.IndexOf(">") <> -1 Then
            Dim pos As Integer
            pos = word.IndexOf(">")
            word = word.Remove(pos, 1)
            word = word.Insert(pos, "&gt;")

        ElseIf word.IndexOf("<") <> -1 Then
            Dim pos As Integer
            pos = word.IndexOf("<")
            word = word.Remove(pos, 1)
            word = word.Insert(pos, "&lt;")

        ElseIf word.IndexOf("'") <> -1 Then
            Dim pos As Integer
            pos = word.IndexOf("'")
            word = word.Remove(pos, 1)
            word = word.Insert(pos, "&apos;")
        End If

        Return word
    End Function


    Public Sub blokVak(ByVal vak As String)
        openBlok()

        Form1.tbPersonalXML.AppendText(ControlChars.Tab & "<Vak>" & vak & "</Vak>" & vbNewLine)
    End Sub

    Public Sub openBlok()
        BezigInBlok = True
        Form1.tbPersonalXML.AppendText("<Blok>" & vbNewLine)
    End Sub

    Public Sub sluitBlok()
        'XMLtoOutlook(vak, klas, docent, lokaal, datum, tijd)
        'toOutlookClass.XMLtoOutlook()
        Form1.tbPersonalXML.AppendText("</Blok>" & vbNewLine)
        BezigInBlok = False
    End Sub

    Public Sub generatePXML()

        Form1.tbPersonalXML.Clear()
        Form1.tbPersonalXML.AppendText("<?xml version=" & Chr(34) & "1.0" & Chr(34) & " encoding=" & Chr(34) & "utf-8" & Chr(34) & "?>" & vbNewLine)
        Form1.tbPersonalXML.AppendText("<XML>" & vbNewLine)

        For Each regel In Form1.tbCSV.Lines

            If regel.StartsWith("Uf") Then
                If BezigInBlok = True Then
                    sluitBlok()
                End If

                huidigeRegel = Split(regel, ",")

                For y = 0 To huidigeRegel.Length - 1
                    If huidigeRegel(y) <> "" And huidigeRegel(y) <> "Uf " Then
                        tempVak = huidigeRegel(y)
                        If Form1.lbVak.SelectedItems.Count > 0 Then
                            For v = 0 To Form1.lbVak.SelectedItems.Count - 1
                                If huidigeRegel(y) = Form1.lbVak.SelectedItems(v) Then
                                    blokVak(huidigeRegel(y))
                                End If
                            Next
                        End If
                    End If
                Next

            End If


            If regel.StartsWith("Uk") Then

                huidigeRegel = Split(regel, ",")

                If BezigInBlok = True Then

                    If KlasGehad = False Then

                        For y = 0 To huidigeRegel.Length - 1
                            If huidigeRegel(y) <> "" And huidigeRegel(y) <> "Uk " Then


                                Form1.tbPersonalXML.AppendText(ControlChars.Tab & "<Klas>" & huidigeRegel(y) & "</Klas>" & vbNewLine)
                                KlasGehad = True
                            End If
                        Next

                    Else
                        For y = 0 To huidigeRegel.Length - 1
                            If huidigeRegel(y) <> "" And huidigeRegel(y) <> "Uk " Then

                                blokVak(tempVak)
                                Form1.tbPersonalXML.AppendText(ControlChars.Tab & "<Klas>" & huidigeRegel(y) & "</Klas>" & vbNewLine)
                                KlasGehad = True
                            End If
                        Next
                    End If




                Else
                    For y = 0 To huidigeRegel.Length - 1
                        If huidigeRegel(y) <> "" And huidigeRegel(y) <> "Uk " Then
                            For k = 0 To Form1.lbKlas.SelectedItems.Count - 1
                                If huidigeRegel(y) = Form1.lbKlas.SelectedItems(k) Then
                                    blokVak(tempVak)
                                    Form1.tbPersonalXML.AppendText(ControlChars.Tab & "<Klas>" & huidigeRegel(y) & "</Klas>" & vbNewLine)
                                End If
                            Next
                        End If
                    Next

                End If
            End If

            If BezigInBlok = True Then
                If regel.StartsWith("Ul") Then

                    huidigeRegel = Split(regel, ",")

                    For y = 0 To huidigeRegel.Length - 1
                        If huidigeRegel(y) <> "" And huidigeRegel(y) <> "Ul " Then
                            Form1.tbPersonalXML.AppendText(ControlChars.Tab & "<Docent>" & huidigeRegel(y) & "</Docent>" & vbNewLine)
                        End If
                    Next
                End If
            End If

            If BezigInBlok = True Then
                If regel.StartsWith("Ur") Then

                    huidigeRegel = Split(regel, ",")

                    For y = 0 To huidigeRegel.Length - 1
                        If huidigeRegel(y) <> "" And huidigeRegel(y) <> "Ur " Then
                            Form1.tbPersonalXML.AppendText(ControlChars.Tab & "<Lokaal>" & huidigeRegel(y) & "</Lokaal>" & vbNewLine)
                        End If
                    Next
                End If
            End If




            If regel.StartsWith("AA02 ") Then
                huidigeRegel = Split(regel, " ")
                datum = CStr(huidigeRegel(1))
                datum = datum.Insert(4, "/")
                datum = datum.Insert(7, "/")
                startdatum = datum
                Form1.tbStartDatum.Text = startdatum
            End If

            If BezigInBlok = True Then
                If regel.StartsWith("UZ00") Then
                    Dim tijdstip As String()

                    huidigeRegel = Split(regel, ",")

                    For y = 0 To huidigeRegel.Length - 1
                        If huidigeRegel(y) <> "" And huidigeRegel(y) <> "UZ00 " And Not CStr(huidigeRegel(y)).StartsWith("R") And Not CStr(huidigeRegel(y)).StartsWith("J") Then
                            tijdstip = Split(huidigeRegel(y), "/")

                            Form1.tbPersonalXML.AppendText(ControlChars.Tab & "<Dag>" & tijdstip(0) & "</Dag>" & vbNewLine)
                            Form1.tbPersonalXML.AppendText(ControlChars.Tab & "<Lesuur>" & tijdstip(1) & "</Lesuur>" & vbNewLine)


                        End If

                    Next
                End If
            End If




            If BezigInBlok = True Then


                If regel.IndexOf("0U") = 0 Then
                    ' Selecteer de Week => 0U is de tag voor de weken
                    Dim huidigeRegel_0U() As String
                    Dim teZoekenString As String = regel

                    ' Split de huidige regel op basis van de comma's
                    huidigeRegel_0U = Split(teZoekenString, ",")

                    For n = 0 To UBound(huidigeRegel_0U)
                        huidigeRegel_0U(n) = huidigeRegel_0U(n).Trim
                        ' Functie checkCharacterReference controleert of er geen tekens zijn die XML niet kan parsen
                        ' voorbeelden zijn de tekens <, >, &, ' en "
                        huidigeRegel_0U(n) = checkCharacterReference(huidigeRegel_0U(n))
                    Next

                    'MessageBox.Show(huidigeRegel_0U(2))

                    Dim week As String = huidigeRegel_0U(2)
                    Dim weekOutput As String = ""


                    If huidigeRegel_0U(2) <> Nothing Then
                        week = week.Remove(0, 2)
                        ' Functie getWeken retourneert de weken in leesbare formaat
                        ' wk1-57-10 wordt bijvoorbeeld 1,2,3,4,5,7,8,9,10
                        ' wk18-10 wordt bijvoorbeeld 1,8,9,10
                        getWeken(week)

                        For n = 0 To Form1.lbWeken.Items.Count - 1
                            If n <> Form1.lbWeken.Items.Count - 1 Then
                                weekOutput = weekOutput + Form1.lbWeken.Items(n).ToString & ","
                            Else
                                weekOutput = weekOutput + Form1.lbWeken.Items(n).ToString
                            End If
                        Next
                    Else
                        ' Zodra in het UNTIS bestand geen week is opgegeven door de roostermaker
                        ' dan doen we er niets mee. Tenzij T.Huberts ermee akkoord gaat dat we
                        ' een weekRandomizer gaan toepassen.
                        weekOutput = ""
                    End If

                    Form1.tbPersonalXML.AppendText(ControlChars.Tab & "<Weken>" & weekOutput & "</Weken>" & vbNewLine)

                End If


            End If

        Next

        Form1.tbPersonalXML.AppendText("</XML>")

    End Sub



    Private Function getWeken(ByVal input As String) As String
        Dim eersteBlok As String = ""
        Dim lengteBlok1 As Integer

        Dim tweedeblok As String
        Dim posTeken1 As Integer
        Dim posTeken2 As Integer

        posTeken1 = input.IndexOf("-")

        If posTeken1 = -1 Then
            ' Wanneer er geen min-teken gevonden is dan gaan we ervan uit dat de weekformat
            ' bijvoorbeeld als volgt is: 
            ' wk1236789
            ' wk1368
            ' en ga zo maar door!

            Form1.lbWeken.Items.Clear()

            Dim i As Integer
            Dim lengteOutput As Integer
            Dim nulTeken As Boolean = False
            Dim output As String = ""

            i = 0
            For Each character In input
                i = i + 1
                Form1.lbWeken.Items.Add(character)
                If character = "0" Then
                    nulTeken = True
                End If
            Next

            If nulTeken = True Then
                ' Verwijder de karakter 0, welke zich op de positie i-1 bevind
                ' vervolgens de karakter 1 verwijderen welke zich op de positie i -2 bevind
                ' ten slotte op de positie i-2 de karakter 10 plaatsen
                Form1.lbWeken.Items.RemoveAt(i - 1)
                Form1.lbWeken.Items.RemoveAt(i - 2)
                Form1.lbWeken.Items.Insert(i - 2, "10")
            End If

            For n = 0 To Form1.lbWeken.Items.Count - 1
                output = output + CStr(Form1.lbWeken.Items(n)) & ","

            Next

            ' Bepalen hoe groot de lengte van de variabel output is
            ' om hiermee de positie van de laatste comma te kunnen bepalen
            ' zodat deze ook verwijderd kan worden
            lengteOutput = output.Length
            output = output.Remove(lengteOutput - 1, 1)

        Else
            ' Wanneer er wel min-teken gevonden is dan gaan we ervan uit dat de weekformat
            ' bijvoorbeeld als volgt is:
            ' wk2-46-8
            ' wk1-478
            ' wk1-810
            ' wk13-10
            ' wk1-10
            ' wk13-8
            ' wk1-46-8
            ' wk1-57-10

            If input.Substring(1, 1) <> "-" Then
                ' Controle of de min-teken op de 1e positie staat
                ' Zodra dat niet het geval is dan bestaat het eerste blok uit 
                ' 1 cijfer dat op de positie input.substring(0,1) (de nulde positie) staat
                eersteBlok = input.Substring(0, 1)
            Else
                If input.Length = 3 Then
                    If input.Substring(1, 1) = "-" Then
                        eersteBlok = input.Substring(0, posTeken1 + 2)
                    End If
                Else
                    If input.Substring(1, 1) = "-" And input.Substring(posTeken1 + 2, 1) = "0" Then
                        eersteBlok = input.Substring(0, posTeken1 + 3)
                    Else

                        If input.Substring(posTeken1 + 2, 1) = "0" Then
                            eersteBlok = input.Substring(0, posTeken1 + 3)
                        Else
                            eersteBlok = input.Substring(0, posTeken1 + 2)
                        End If
                    End If
                End If

            End If

            lengteBlok1 = eersteBlok.Length

            ' Bepalen of er een 2e blok periode aanwezig is d.m.v. te zoeken op de min teken
            If input.IndexOf("-", lengteBlok1) <> -1 Then
                posTeken2 = input.IndexOf("-", lengteBlok1)
            End If

            tweedeblok = input.Substring(lengteBlok1, input.Length - lengteBlok1)

            'MessageBox.Show("1e blok: " & eersteBlok & NewLine _
            ' & "2e blok: " & tweedeblok)

            fillLboxWeken(eersteBlok, tweedeblok)
        End If
        ' We returnen niets naar het aanroepend programmacode
        ' indien gewenst kan er nog een status bericht geretourneerd worden
        Return Nothing
    End Function

    Private Function fillLboxWeken(ByVal eersteBlok As String, ByVal tweedeBlok As String) As String
        Dim input = eersteBlok
        Dim beginWeek As Integer
        Dim eindWeek As Integer

        Form1.lbWeken.Items.Clear()

        beginWeek = CInt(input.Substring(0, 1))

        If input.Length = 1 Then ' Zodra het eerste blok maar uit 1 week bestaat
            beginWeek = CInt(input.Substring(0, 1))
            eindWeek = CInt(input.Substring(0, 1))
        Else
            ' Zodra het eerste blok niet uit 1 week bestaat eerst controleren
            ' of het laatste week, week 10 is (check op cijfer 0)
            If input.IndexOf("0") <> -1 Then ' Zodra de 0 gevonden is 
                eindWeek = CInt(input.Substring(2, 2))
            Else
                ' Zodra het laatste week, niet week 10 is dan het cijfer pakken
                ' na de min teken.
                eindWeek = CInt(input.Substring(2, 1))
            End If

        End If

        For n = beginWeek To eindWeek
            Form1.lbWeken.Items.Add(n)
        Next

        If tweedeBlok.Length <> 0 Then
            input = tweedeBlok

            beginWeek = CInt(input.Substring(0, 1))

            If input.Length = 1 Then
                beginWeek = CInt(input.Substring(0, 1))
                eindWeek = CInt(input.Substring(0, 1))
            ElseIf input.Length = 2 And input.Substring(1, 1) <> "0" Then
                beginWeek = CInt(input.Substring(0, 1))
                eindWeek = CInt(input.Substring(1, 1))
            ElseIf input.Length = 2 And input.Substring(1, 1) = "0" Then
                beginWeek = CInt(input.Substring(0, 2))
                eindWeek = CInt(input.Substring(0, 2))
            Else

                If input.IndexOf("0") <> -1 Then
                    ' Zodra de week als volgt is opgebouwd wk13-10 dan wordt
                    ' eindWeek via de substring functie bepaald

                    '             12
                    'index      0123
                    'waarde     3-10
                    eindWeek = CInt(input.Substring(2, 2))
                Else
                    eindWeek = CInt(input.Substring(2, 1))
                End If

            End If
        Else

        End If

        If tweedeBlok.Length <> 0 Then
            For n = beginWeek To eindWeek
                Form1.lbWeken.Items.Add(n)
            Next
        End If

        ' We returnen niets naar het aanroepend programmacode
        ' indien gewenst kan er nog een status bericht geretourneerd worden
        Return Nothing
    End Function




















End Class
